package com.hqd.ch03.v25.spel;

/**
 * 对象访问接口
 */
public interface PropertyAccessor {
    /**
     * 返回可以解析的类型数组
     *
     * @return
     */
    Class<?>[] getSpecificTargetClasses();

    /**
     * 检查是否能读取该属性
     *
     * @param context
     * @param target
     * @param name
     * @return
     */
    boolean canRead(EvaluationContext context, Object target, String name);

    /**
     * 读取属性值
     *
     * @param context
     * @param target
     * @param name
     * @return
     */
    Object read(EvaluationContext context, Object target, String name);

    /**
     * 检查该属性是否可以写入
     *
     * @param context
     * @param target
     * @param name
     * @return
     */
    boolean canWrite(EvaluationContext context, Object target, String name);

    /**
     * 写入该属性
     *
     * @param context
     * @param target
     * @param name
     * @param newValue
     */
    void write(EvaluationContext context, Object target, String name, Object newValue);
}
